home *** CD-ROM | disk | FTP | other *** search
File List | 1991-07-21 | 26.4 KB | 499 lines |
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 1
- dates.ASM
-
-
-
- 1 %PAGESIZE 58,124
- 2 ;*******************************************************************************
- 3 ;
- 4 ; ZDAY and ZDATE
- 5 ;
- 6 ; These are routines for converting Gregorian dates to and from Day Numbers.
- 7 ;
- 8 ; The routines are called using the PASCAL calling sequence, and are FAR calls.
- 9 ; All pointers are FAR pointers.
- 10 ;
- 11 ; The routines are written to run on an 8088 so as to be compatible with all
- 12 ; machines based on this architecture, and use the Borland "PASCAL" calling
- 13 ; sequence so as to be callable from programs compiled with both Borland's C
- 14 ; and Pascal compilers.
- 15 ;
- 16 ; The Borland Turbo Assembler (V2.0 or better) is required to assemble this code.
- 17 ;
- 18 ;===============================================================================
- 19 ;
- 20 ; The C calling sequences are defined by these prototypes:
- 21 ;
- 22 ; unsigned long int far pascal ZDay( unsigned int Year, unsigned int Month,
- 23 ; unsigned int Day );
- 24 ;
- 25 ; int far pascal ZDate(unsigned long int DayNumber, unsigned int far *Year,
- 26 ; unsigned int far *Month, unsigned int far *Day );
- 27 ;
- 28 ;-------------------------------------------------------------------------------
- 29 ;
- 30 ; The PASCAL prototypes (you will $L the object code from this assembly into
- 31 ; a TPU) would be:
- 32 ;
- 33 ; function ZDay(Year, Month, Day : word) : longint;
- 34 ;
- 35 ; function ZDate(DayNumber : longint; var Year, Month, Day : word ) : boolean;
- 36 ;
- 37 ;-------------------------------------------------------------------------------
- 38 ;
- 39 ; ZDay returns a 32-bit unsigned integer representing the Day Number calculated
- 40 ; from the supplied Gregorian date. Although the Pascal call defines it as a
- 41 ; longint, you will not have to worry about getting a negative number back.
- 42 ;
- 43 ; If the resulting Day Number is zero, you have supplied a Gregorian date that
- 44 ; is too early or too far in the future for the calculations to be performed
- 45 ; correctly with this routine's methods.
- 46 ;
- 47 ; The Year, Month and Day parameters are all unsigned 16-bit integers, Year
- 48 ; must be the FULL YEAR. 1902 must be supplied as 1902, not 02. It must be
- 49 ; in the range 1 to 25599 or zero will be returned. Month and Day must be in
- 50 ; the range 0-65535. These restrictions should not be too restrictive for most
- 51 ; purposes.
- 52 ;
- 53 ; Note that Day, Month and Year are all UNSIGNED. When you are doing weird
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 2
- dates.ASM
-
-
-
- 54 ; date calculations you must NEVER try to supply negative values for these.
- 55 ; This is also true of the any Day Number you give to ZDate! Negative numbers
- 56 ; look like large positive numbers and will give Wrong Results!
- 57 ;
- 58 ; The same parameters are used with ZDate, except no value is returned since it
- 59 ; is a procedure (void function) rather than a function. Just supply the Day
- 60 ; Number, and ZDate fills in the Year, Month and Day for you. The supplied Day
- 61 ; Number should be greater than 121 and less than 23920640. For Day Numbers
- 62 ; outside this range, ZDate returns a Gregorian date of 0-0-0 and a return
- 63 ; value of 0 (FALSE in both Pascal and C). A good conversion returns 1 (TRUE
- 64 ; in both C and Pascal).
- 65 ;
- 66 ; NOTE: ZDay can convert certain dates into Day Numbers that are outside the
- 67 ; range that ZDate can convert back. These dates, however, involve years
- 68 ; that are either zero or very, very large, and are well outside the range of
- 69 ; dates that we are likely to be interested in.
- 70 ;
- 71 ; A call to ZDay uses 14 bytes of space on the stack; a call to ZDate uses 26.
- 72 ;
- 73 ;===============================================================================
- 74 ;
- 75 ; WHAT'S IT ALL FOR, ANYWAY?
- 76 ;
- 77 ; All dates, valid or not, convert to Day Numbers of some kind. All Day
- 78 ; Numbers convert to valid Gregorian dates. So if you convert a Gregorian
- 79 ; date to a Day Number and back, if the resulting Gregorian date doesn't match
- 80 ; the original, the original was invalid.
- 81 ;
- 82 ; The Day Number is related to the Julian Day Number, but is not the same.
- 83 ; It is valid only for the years since the Gregorian calendar was introduced.
- 84 ;
- 85 ; You can use the Day Numbers of two dates to find the number of days between
- 86 ; them.
- 87 ;
- 88 ; The remainder resulting when the Day Number is divided by 7 is the day of the
- 89 ; week, with 0 (Sunday) thru 6 (Saturday).
- 90 ;
- 91 ; To find the last day of a month, begin with the Gregorian date. Add 1 to
- 92 ; the month (even to December), set the Day to 0, convert to a Day Number, then
- 93 ; back to Gregorian.
- 94 ;
- 95 ; To find the Julian day of the year (different from the Julian Day Number!),
- 96 ; convert the given Gregorian date to a Day Number. Then subtract from this
- 97 ; the Day Number of January 0 (NOT 1!) of the same year.
- 98 ;
- 99 ; Convert a Julian Date to Gregorian by taking the Day Number of of January
- 100 ; ZERO of the year. Add the Julian day of the year to this, then convert
- 101 ; to a Gregorian date.
- 102 ;
- 103 ;*******************************************************************************
- 104 ; (c) Copyright 1991 Crazy Jack
- 105 ; All Rights Reserved
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 3
- dates.ASM
-
-
-
- 106 %NEWPAGE
- 107 IDEAL
- 108 0000 MODEL LARGE
- 109 0000 CODESEG
- 110 ;
- 111 ; The simplest routine converts the Gregorian date to a Day Number:
- 112 ;
- 113 0000 PROC PASCAL ZDAY FAR Year:WORD, Month:WORD, Day:WORD
- 114 PUBLIC ZDAY
- 1 115 0000 55 PUSH BP
- 1 116 0001 8B EC MOV BP,SP
- 1 117 0003 8B 4E 0A MOV CX, [Year] ;Get Year.
- 118 0006 8B 5E 08 MOV BX, [Month] ;Get Month.
- 119 0009 83 FB 0E CMP BX, 14 ;Month greater than 14 will give
- 120 000C 77 5A JA FIXMNTH ;incorrect results.
- 121 000E MNTHOK:
- 122 000E 80 FB 02 CMP BL, 2 ;Is Month January or February?
- 123 0011 77 08 JA NOADJ ;Jump if not,
- 124
- 125 0013 0B C9 OR CX, CX ;else be sure year isn't zero (we're
- 126 0015 74 60 JZ DATEBAD ;in trouble if we decrement zero),
- 127 0017 49 DEC CX ;then shift calculations to joint
- 128 0018 83 C3 0C ADD BX, 12 ;between February and March.
- 129 001B NOADJ:
- 130 001B 80 FD 64 CMP CH, 100 ;Any year too big to be divided by 100
- 131 001E 73 57 JAE DATEBAD ;16-by-8-bit will cause divide overflow.
- 132 0020 43 INC BX ;Need a little adjustment here---.
- 133
- 134 0021 B8 AB51 MOV AX, 43857 ;Calculate number of days due to months:
- 135 0024 F7 E3 MUL BX ;First multiply by 306001, more than 16
- 136 0026 D1 E3 SHL BX, 1 ;bits worth. The upper word is 4. We
- 137 0028 D1 E3 SHL BX, 1 ;use shifts for speed. Earlier test
- 138 002A 03 D3 ADD DX, BX ;against 2141 ensures no overflow and
- 139 002C BB 2710 MOV BX, 10000 ;that we can divide by 10000.
- 140 002F F7 F3 DIV BX ;This gives INT(month * 30.6001).
- 141 0031 8B D8 MOV BX, AX ;Save the result (days due to months).
- 142
- 143 0033 B8 016D MOV AX, 365 ;Now for days due to years:
- 144 0036 F7 E1 MUL CX ;Gives days in normal years.
- 145 0038 03 C3 ADD AX, BX ;Add in days due to months.
- 146 003A 83 D2 00 ADC DX, 0 ;(There will be no carry from this!)
- 147 003D 50 PUSH AX ;We need the AX for another divide.
- 148
- 149 003E D1 E9 SHR CX, 1 ;Find number of extra days due to
- 150 0040 D1 E9 SHR CX, 1 ;leap years (add a year for every 4).
- 151 0042 8B C1 MOV AX, CX ;Remove days for 400-year
- 152 0044 B3 19 MOV BL, 25 ;Gregorian rule:
- 153 0046 F6 F3 DIV BL ;First remove leap year day for each
- 154 0048 32 E4 XOR AH, AH ;century---
- 155 004A 2B C8 SUB CX, AX ;Result will always be positive.
- 156 004C D0 E8 SHR AL, 1 ;Then add back a leap year day for
- 157 004E D0 E8 SHR AL, 1 ;each 400 years.
- 158 0050 03 C1 ADD AX, CX ;No carry will occur. Why?
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 4
- dates.ASM
-
-
-
- 159
- 160 0052 5B POP BX
- 161 0053 03 C3 ADD AX, BX ;Add leap year days to days due to
- 162 0055 83 D2 00 ADC DX, 0 ;month and year.
- 163 0058 03 46 06 ADD AX, [Day] ;Fold in day of the month.
- 164 005B 83 D2 00 ADC DX, 0
- 165 005E 2D 0001 SUB AX, 1 ;Finally, adjust so remainder from
- 166 0061 83 DA 00 SBB DX, 0 ;divide by 7 gives day of week.
- 167 ;Back to caller with Day Number
- 168 0064 GONE: ;Day Number in DX:AX.
- 1 169 0064 5D POP BP
- 1 170 0065 CA 0006 RET 0006h
- 171 ;
- 172 0068 FIXMNTH: ;Sigh. Month is too big to give valid
- 173 0068 8B C3 MOV AX, BX ;results, so we must reduce it. We put
- 174 006A 33 D2 XOR DX, DX ;this here since it won't happen often
- 175 006C BB 000C MOV BX, 12 ;and we don't want to slow the main line.
- 176 006F F7 F3 DIV BX ;We convert it to years and months.
- 177 0071 8B DA MOV BX, DX ;Remainder becomes new month.
- 178 0073 03 C8 ADD CX, AX ;Quotient is years. Add to given year.
- 179 0075 73 97 JNC MNTHOK ;Back to conversion if still in range.
- 180 ;
- 181 0077 DATEBAD:
- 182 0077 33 C0 XOR AX, AX ;If something's wrong, we clear the
- 183 0079 8B D0 MOV DX, AX ;Day Number in DX:AX to zero
- 184 007B EB E7 JMP GONE ;and clear out.
- 185 ;
- 186 007D ENDP ZDAY
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 5
- dates.ASM
-
-
-
- 187 %NEWPAGE
- 188 ;
- 189 ; Converting a Day Number back to a Gregorian date is more complicated:
- 190 ;
- 191 007D PROC PASCAL ZDATE FAR DayNumber:WORD:2, Year:FAR PTR WORD, Month:FAR PTR +
- 192 WORD, Day:FAR PTR WORD
- 193 PUBLIC ZDATE
- 1 194 007D 55 PUSH BP
- 1 195 007E 8B EC MOV BP,SP
- 1 196 0080 56 PUSH SI
- 197 0081 57 PUSH DI
- 198 0082 8B 56 14 MOV DX, [DayNumber+2] ;Get Day Number from caller.
- 199 0085 81 FA 016D CMP DX, 365 ;Bigger than this and we can't
- 200 0089 73 69 JAE RELAY2 ;extract the year!
- 201 008B 8B 46 12 MOV AX, [DayNumber] ;Okay, get the rest of the Day Number.
- 202
- 203 008E 8B F0 MOV SI, AX ;We save a copy of it.
- 204 0090 8B FA MOV DI, DX
- 205 0092 2D 0079 SUB AX, 121 ;First we back out the 400-year
- 206 0095 83 DA 00 SBB DX, 0 ;Gregorian rule.
- 207 0098 72 53 JC RELAY1 ;Day number must be greater than 120.
- 208 009A BB BE3B MOV BX, 48699 ;There are 146097 days in 400 years.
- 209 009D F7 F3 DIV BX ;146097 = 48699 * 3. We divide in
- 210 009F 8B CA MOV CX, DX ;two steps, first by 48699, then by 3.
- 211 00A1 33 D2 XOR DX, DX
- 212 00A3 BB 0003 MOV BX, 3
- 213 00A6 F7 F3 DIV BX ;The resulting quotient 1/3 of the leap
- 214 00A8 03 F0 ADD SI, AX ;year days removed by the 4000-year rule.
- 215 00AA 83 D7 00 ADC DI, 0 ;We add them back 3 times, which is
- 216 00AD 03 F0 ADD SI, AX ;quicker than multiplying by 3.
- 217 00AF 83 D7 00 ADC DI, 0
- 218 00B2 40 INC AX ;Here's the quickest place to add back
- 219 00B3 03 F0 ADD SI, AX ;the 1 we subtracted in ZDay to aid in
- 220 00B5 83 D7 00 ADC DI, 0 ;finding the day of the week.
- 221 00B8 B8 BE3B MOV AX, 48699 ;We now finish calculating the remainder
- 222 00BB F7 E2 MUL DX ;from the two divisions which gives us
- 223 00BD 03 C1 ADD AX, CX ;the number of days into the current 400
- 224 00BF 83 D2 00 ADC DX, 0 ;years.
- 225 00C2 8B CA MOV CX, DX ;Is there a remainder?
- 226 00C4 0B C8 OR CX, AX
- 227 00C6 74 10 JZ GREGOUT ;If not, we save some calculation time.
- 228
- 229 00C8 2D 0001 SUB AX, 1 ;Now we calculate the number of leap
- 230 00CB 83 DA 00 SBB DX, 0 ;years dropped so far THIS 400 years---
- 231 00CE B9 8EAC MOV CX, 36524 ;(Number of days in 3 out of 4
- 232 00D1 F7 F1 DIV CX ;centuries.)
- 233 00D3 03 F0 ADD SI, AX ;---and add THAT back in.
- 234 00D5 83 D7 00 ADC DI, 0
- 235 00D8 GREGOUT:
- 236 00D8 8B C7 MOV AX, DI ;We now the divide adjusted Day Number
- 237 00DA BB 0064 MOV BX, 100 ;by 365.25 to get the year. The
- 238 00DD F7 E3 MUL BX ;remainder will be the day of the year.
- 239 00DF 8B C8 MOV CX, AX
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 6
- dates.ASM
-
-
-
- 240 00E1 8B C6 MOV AX, SI
- 241 00E3 F7 E3 MUL BX
- 242 00E5 03 D1 ADD DX, CX
- 243 00E7 2D 2FB2 SUB AX, 12210
- 244 00EA 83 DA 00 SBB DX, 0
- 245 00ED 72 64 RELAY1: JC DAYBAD ;Don't sweat the speed loss on errors.
- 246 00EF B9 8EAD MOV CX, 36525
- 247 00F2 3B D1 CMP DX, CX ;Be sure we can divide adjusted value.
- 248 00F4 73 5D RELAY2: JAE DAYBAD
- 249 00F6 F7 F1 DIV CX
- 250 00F8 8B F8 MOV DI, AX ;Year (or year-1) now in the DI.
- 251
- 252 00FA B8 05B5 MOV AX, 1461 ;Note that this gives us a number of
- 253 00FD F7 E7 MUL DI ;days beyond the calculated year, which
- 254 00FF D1 DA RCR DX, 1 ;is NOT the remainder from the previous
- 255 0101 D1 D8 RCR AX, 1 ;divide.
- 256 0103 D1 DA RCR DX, 1 ;1461/4 = 365.25, our multiplier.
- 257 0105 D1 D8 RCR AX, 1 ;Since the difference can't exceed
- 258 0107 2B F0 SUB SI, AX ;487 we only subtract low-order words.
- 259
- 260 0109 B8 2710 MOV AX, 10000 ;We must now divide the days beyond the
- 261 010C F7 E6 MUL SI ;calculated year by 30.6001 to get the
- 262 010E BB 268F MOV BX, 9871 ;unadjusted month. To do this we multi-
- 263 0111 F7 F3 DIV BX ;ply by 10000, then divide by 306001,
- 264 0113 B9 001F MOV CX, 31 ;which is more than 16 bits long. Since
- 265 0116 F6 F1 DIV CL ;306001 = 31*9871, we divide in 2 steps.
- 266 0118 8A C8 MOV CL, AL ;Got the unadjusted month now in the BX.
- 267
- 268 011A 87 D3 XCHG DX, BX ;We must now finish getting the
- 269 011C 8A C4 MOV AL, AH ;remainder which is 10000 times the
- 270 011E 8A E5 MOV AH, CH ;day of the month.
- 271 0120 F7 E2 MUL DX
- 272 0122 03 C3 ADD AX, BX
- 273 0124 83 D2 00 ADC DX, 0
- 274 0127 BB 2710 MOV BX, 10000 ;Divide out the 10000 and the AX contains
- 275 012A F7 F3 DIV BX ;one less than the day of the month>
- 276 012C 40 INC AX
- 277
- 278 012D FE C9 DEC CL ;Adjust start of year back to between
- 279 012F 80 F9 0C CMP CL, 12 ;December and January. By now the month
- 280 0132 76 04 JBE MNTHRDY ;is less than 16 and the day is in the
- 281 0134 80 E9 0C SUB CL, 12 ;range 1-31.
- 282 0137 47 INC DI
- 283 0138 MNTHRDY:
- 284 0138 8C DA MOV DX, DS ;Begin storing results for caller.
- 285 013A C5 5E 06 LDS BX, [Day]
- 286 013D 89 07 MOV [BX], AX
- 287 013F B0 01 MOV AL, 1 ;Set Pascal/C TRUE for caller (AH=0).
- 288 0141 OUTAHERE:
- 289 0141 C5 5E 0A LDS BX, [Month]
- 290 0144 89 0F MOV [BX], CX
- 291 0146 C5 5E 0E LDS BX, [Year]
- 292 0149 89 3F MOV [BX], DI
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 7
- dates.ASM
-
-
-
- 293 ;
- 294 014B 8E DA MOV DS, DX ;Restore caller and return.
- 295 014D 5F POP DI
- 296 014E 5E POP SI
- 1 297 014F 5D POP BP
- 1 298 0150 CA 0010 RET 0010h
- 299 ;
- 300 0153 DAYBAD:
- 301 0153 8C DA MOV DX, DS
- 302 0155 33 C0 XOR AX, AX ;Supplies zero to store and to return.
- 303 0157 C5 5E 06 LDS BX, [Day] ;Return zeroes for all output values.
- 304 015A 89 07 MOV [BX], AX
- 305 015C 8B C8 MOV CX, AX
- 306 015E 8B F8 MOV DI, AX
- 307 0160 EB DF JMP OUTAHERE ;Go return to caller.
- 308 ;
- 309 0162 ENDP ZDATE
- 310 ;
- 311 0162 ENDS
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 8
- dates.ASM
-
-
-
- 312 %NEWPAGE
- 313 ;*******************************************************************************
- 314 ;
- 315 ; About the Claculations
- 316 ;
- 317 ; There are a number of descriptions of Day Number routines floating around.
- 318 ; The ones I use came from a routine I saw for the HP-65 programmable pocket
- 319 ; calculator to find the Julian Day Number. To it I added adjustments for the
- 320 ; 400-day Gregorian rule. We don't need it for the coming turn of the century
- 321 ; since 200 divides by 400 without a remainder and is, thus, a leap year, but
- 322 ; programmers are picky by nature, so -- what the heck.
- 323 ;
- 324 ; To calculate the Day Number from a Gregorian date we first adjust the year and
- 325 ; month so the month values run from 4 to 15, with March being 4 and February
- 326 ; being 15:
- 327 ;
- 328 ; if Month < 3
- 329 ; then
- 330 ; Add 13 to Month
- 331 ; Subtract 1 from Year
- 332 ; otherwise
- 333 ; Add 1 to Month.
- 334 ;
- 335 ; Now comes the meat of the calculation:
- 336 ;
- 337 ; Day Number = Day of the month
- 338 ; + The Integer Part of (Month * 30.6001)
- 339 ; + The Integer Part of (Year * 365.25)
- 340 ; - The Integer Part of (3/4 of
- 341 ; The Integer Part of (Year / 400)
- 342 ; ).
- 343 ;
- 344 ; That last mess accounts for the Gregorian 400-year rule. Now if we divide
- 345 ; this by 7 (to find the day of the week) we get 0 for Saturday. For a
- 346 ; variety of reasons, mostly related to common practice, I decided to adjust
- 347 ; this further by subtracting 1 from it so Sunday becomes 0.
- 348 ;
- 349 ; Converting back is not so easy.
- 350 ;
- 351 ; First we back out the Gregorian 400-year rule:
- 352 ;
- 353 ; Divide Day Number less 121 by 146097:
- 354 ; Q = the quotient
- 355 ; R = the remainder.
- 356 ;
- 357 ; if R is not 0
- 358 ; then
- 359 ; Add the quotient from ( (R -1) / 36524 ) to Q.
- 360 ;
- 361 ; N = Day Number plus 1 plus Q.
- 362 ;
- 363 ; Note that 145097 is the number of days in 400 years with the 400-year rule
- 364 ; applied, and 36524 is the number of days in a century in which the century
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 9
- dates.ASM
-
-
-
- 365 ; year is NOT a leap year. 36525 is the number of days in a century where the
- 366 ; century year IS a leap year. Once the 400-year rule is backed out, we have
- 367 ; ALL centuries containing 36525 days, which simplifies our calculations.
- 368 ;
- 369 ; Now we can extract the Gregorian date from the adjusted Day Number "N".
- 370 ; First we get the tentative year:
- 371 ;
- 372 ; Year = The Integer Part of ( (N - 122.1) / 365.25 ).
- 373 ;
- 374 ; --and we remove the year's worth of days from the adjusted Day Number "N":
- 375 ;
- 376 ; N = N - The Integer Part of (Year * 365.25).
- 377 ;
- 378 ; From this we extract the tentative month:
- 379 ;
- 380 ; Month = The Integer Part of (N / 30.6001).
- 381 ;
- 382 ; The current day is what is left over when we remove the days due to the
- 383 ; months:
- 384 ;
- 385 ; Day = N - The Integer Ppart of (Month * 30.6001).
- 386 ;
- 387 ; Finally we adjust the Year and the Month:
- 388 ;
- 389 ; if Month > 13
- 390 ; then
- 391 ; Subtract 13 from Month
- 392 ; Add 1 to the Year
- 393 ; else
- 394 ; Subtract 1 from the Month.
- 395 ;
- 396 ; --and the deed is done.
- 397 ;
- 398 ; Since it is my intention that this set of routines be usable on all PC com-
- 399 ; patible systems, we can't assume the availability of a numeric coprocessor or
- 400 ; 32-bit arithmetic, so everything is done in 16-bit integer arithmetic using
- 401 ; the CPU registers and 8086 instructions. In some places it makes the code a
- 402 ; little awkward, but it gives its best performance on the lowliest of PCs
- 403 ; where it's needed the most.
- 404 ;
- 405 ; I chose the Pascal calling sequence so that I could use the code with both C
- 406 ; and Pascal programs. If you don't mind shoving stuff on the stack and the
- 407 ; other fooling around, you can use the routines with assembly code as well.
- 408 ;
- 409 END
- Turbo Assembler Version 2.5 07/21/91 16:39:26 Page 10
- Symbol Table
-
-
-
-
- Symbol Name Type Value Cref (defined at #)
-
- ??DATE Text "07/21/91"
- ??FILENAME Text "dates "
- ??TIME Text "16:39:25"
- ??VERSION Number 0205
- @CODE Text DATES_TEXT #108 #108 #109
- @CODESIZE Text 1 #108
- @CPU Text 0101H
- @CURSEG Text DATES_TEXT #109
- @DATA Text DGROUP #108
- @DATASIZE Text 1 #108
- @FILENAME Text DATES
- @MODEL Text 5 #108
- @WORDSIZE Text 2 #109
- DATEBAD Near DATES_TEXT:0077 126 131 #181
- DAY Number [DGROUP:BP+0006] #113 163 #191 285 303
- DAYBAD Near DATES_TEXT:0153 245 248 #300
- DAYNUMBER Number [DGROUP:BP+0012] #191 198 201
- FIXMNTH Near DATES_TEXT:0068 120 #172
- GONE Near DATES_TEXT:0064 #168 184
- GREGOUT Near DATES_TEXT:00D8 227 #235
- MNTHOK Near DATES_TEXT:000E #121 179
- MNTHRDY Near DATES_TEXT:0138 280 #283
- MONTH Number [DGROUP:BP+000A] #113 118 #191 289
- NOADJ Near DATES_TEXT:001B 123 #129
- OUTAHERE Near DATES_TEXT:0141 #288 307
- RELAY1 Near DATES_TEXT:00ED 207 #245
- RELAY2 Near DATES_TEXT:00F4 200 #248
- YEAR Number [DGROUP:BP+000E] #113 117 #191 291
- ZDATE Far DATES_TEXT:007D #191 193
- ZDAY Far DATES_TEXT:0000 #113 114
-
- Groups & Segments Bit Size Align Combine Class Cref (defined at #)
-
- DATES_TEXT 16 0162 Word Public CODE #108 108 #109 109
- DGROUP Group #108 108
- _DATA 16 0000 Word Public DATA #108
-